import re


# 匹配单个字符
def single_match():
    """
      1. \d 匹配一个数字
      2. [] 中括号有啥匹配啥
      3. \w 等价于a-z A-Z 0-9 _，还支持中文范围太广不建议使用
      4. \s 匹配空白字符 一个空格 \t都可以匹配
      5. 所有大写都为小写的取反，例如\D匹配非数字
      6。 。匹配除\n所有字符
      """

    res = re.match(r"速度与激情\d", "速度与激情11")
    # 正则表达式匹配成功则返回一个对象，匹配出来的内容在group中
    # \d只会匹配一个字符 所以返回速度与激情1
    print(res.group())

    # 如果不匹配则抛出异常，匹配 速度与激情1-5
    print(re.match(r"速度与激情[1-5]", "速度与激情1").group())
    # 匹配1~3,6~9,4 5不能匹配到
    print(re.match(r"速度与激情[1-36-9]", "速度与激情23443").group())
    # 匹配数字+字符,只会从中括号去一个字符匹配
    print(re.match(r"速度与激情[1-5a-zA-E]", "速度与激情a").group())

    print(re.match(r"速度与激情\w", "速度与激情12").group())

    print(re.match(r"速度与激情\s\d", "速度与激情\t1").group())
    print(re.match(r"速度与激情.", "速度与激情xxx").group())


# 匹配多个字符
def multi_match():
    """
    ? 匹配1或0
    * 0或多个包括空字符串
    + 1或多个，无法匹配空
    """
    # 匹配1~2位数字个数
    print(re.match(r"速度与激情\d{1,2}", "速度与激情12").group())
    # 必须有11位连续数字
    print(re.match(r"\d{11}", "17561940361").group())
    # ?前的字符- 有1个或0个
    print(re.match(r"0532-?\d{7}", "0532-8888888").group())
    # * 匹配所有 .表示除换行外任意字符，*表示0或任意个,re.S让 . 可以匹配\n
    print(re.match(r".*", "asdfghh\nasdf", re.S).group())
    # + 匹配1个或多个
    print(re.match(r".+", "asdfghh").group())


def match_var():
    """判断变量名是否符合规范
        ^ 以什么开头 英文字符和下划线
        $ 以什么结尾 以\w可以匹配的字符结尾，即a-z、A-Z、0-9、_结尾
    """
    var_list = ["age", "_age", "age#", "a!ge", "1age", "age11"]
    for var in var_list:
        ret = re.match(r"^[a-zA-Z_]\w*$", var)
        if ret:
            print(var, "符合变量名要求")
        else:
            print(var, "不符合变量名要求")


def match_email():
    """匹配email
        .、? 这种需要转义
        \w 还可以匹配中文
    """
    ret = re.match(r"[a-zA-Z_0-9]{4,20}@163\.com$", "aaaaa@163.com")
    if ret:
        print(ret.group())
    else:
        print("不符合邮件地址")


def main():
    # single_match()
    # multi_match()
    # match_var()
    match_email()


if __name__ == '__main__':
    main()
